#include "frame_task_queue.h"

int taskQueueInit(taskQueue_t *pTaskQueue) {
    memset(pTaskQueue, 0, sizeof(taskQueue_t));
    return 0;
}

void taskQueueFree(taskQueue_t *pTaskQueue) {
    if (pTaskQueue == NULL) {
        return;  // 防止空指针解引用
    }

    // 遍历链表释放所有节点
    queue_node_t *current = pTaskQueue->front;
    while (current != NULL) {
        queue_node_t *temp = current;  // 保存当前节点
        current = current->next;      // 移动到下一个节点
        close(temp->netfd);           // 关闭文件描述符
        free(temp);                   // 释放当前节点
    }

    // 重置队列状态
    pTaskQueue->front = NULL;
    pTaskQueue->rear = NULL;
    pTaskQueue->size = 0;
}

int enQueue(taskQueue_t *pTaskQueue, int netfd) {
    queue_node_t *pNew = (queue_node_t*)calloc(1, sizeof(queue_node_t));
    pNew->netfd = netfd;

    if(pTaskQueue->size == 0) {
        pTaskQueue->front = pNew;
        pTaskQueue->rear = pNew;
    }
    else {
        pTaskQueue->rear->next = pNew;
        pTaskQueue->rear = pNew;
    }

    pTaskQueue->size++;

    return 0;
}

int deQueue(taskQueue_t *pTaskQueue, int *pNetfd) {
    if(pTaskQueue->size == 0) {
        return -1;
    }

    queue_node_t *pCur = pTaskQueue->front;
    *pNetfd = pCur->netfd;
    pTaskQueue->front = pCur->next;

    if(pTaskQueue->size == 1) {
        pTaskQueue->rear = NULL;
    }

    free(pCur);
    pTaskQueue->size--;

    return 0;
}